/*
	En terminos practicos esta clase maneja una lista de sprites para representar una animacion.
	La idea es que  cualquier cuerpo del juego pueda ser representado como coleccion de animaciones para sus ditintas facetas
*/

#include <vector>
#define TEMP 50

class animacion
{
	public:
	SDL_Rect dest, escala;
	Uint8 alfa;
	vector<SDL_Surface> v;
	Uint32 tiempo;
	
	Uint16 numFrame; // Frame que se muestra actualmente
	Uint32 t0;
	Uint32 t1;
	animacion(char * frame1)
	{
		alfa=255;
		numFrame=0; // numero de frames en la animacion

		tiempo= 5000;	
			
		SDL_Surface *temp;
		temp = SDL_LoadBMP(frame1);
		
		SDL_SetColorKey(temp, SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(temp->format, 0, 255, 0));
		
		v.push_back(*temp);
		
		Uint32 t0 = SDL_GetTicks(); // Para el control de las animaciones
		//SDL_FreeSurface(temp);
	}
	
	~animacion()
	{
		for (int i=0; i< v.size();i++) SDL_FreeSurface(&v.at(i));
	}
	

	
	void dibujar(SDL_Surface *destino,  float pos_x, float pos_y, float pos_z)
	{
		Uint32 t1;
		t1 = SDL_GetTicks();
		if((t1 - t0) > tiempo) 
		{
			nextFrame();
			t0 = SDL_GetTicks();
		}
	
		escala.x = (Sint16)0;		
		escala.y = (Sint16)0;
		escala.w = (Sint16)v.at(numFrame).w;
		escala.h = (Sint16)v.at(numFrame).h;
		
		dest.x = (Sint16)pos_x;		
		dest.y = (Sint16)pos_y;
		dest.w = (Sint16)v.at(numFrame).w;
		dest.h = (Sint16)v.at(numFrame).h;
		
		SDL_BlitSurface(&v.at(numFrame), &escala, destino, &dest);

	}
	
	// Mueve la animacion al siguiente frame
	void nextFrame(){
		numFrame++;
		if (numFrame>v.size()-1) numFrame=0;
	}
	
	/*
	*	Agrega un frame a la animacion. Hay que cuidar que se haga en el mismo orden que se desea ver al correrla en pantalla
	*
	*/
	void agregarFrame(char * frame1)
	{
		SDL_Surface *temp;
		temp = SDL_LoadBMP(frame1);
		SDL_SetColorKey(temp, SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(temp->format, 0, 255, 0));
		v.push_back(*temp);
		//SDL_FreeSurface(temp);
	}
	
	void difuminar(Uint8 x)
	{
		alfa-=(Uint8)80 +(Uint8)x;
		SDL_SetAlpha(&v.at(numFrame), SDL_SRCALPHA|SDL_RLEACCEL, alfa);
	}
	
	void difuminar()
	{
		alfa-=(Uint8)80 ;
		SDL_SetAlpha(&v.at(numFrame), SDL_SRCALPHA|SDL_RLEACCEL, alfa);
	}
	
};
